﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Asol.Reporting.Support.Parser;

namespace Asol.Reporting.Editor.SqlCommands
{
    /// <summary>
    /// SQL příkaz: SELECT
    /// </summary>
    public class SqlSelect : SqlPart, ISqlCommand
    {
        #region Konstrukce
        /// <summary>
        /// Bezparametrický konstruktor je povinností pro ISqlCommand, což je IPlugin a zachází se s ním jak se services
        /// </summary>
        public SqlSelect()
        {
            this._InitParts();
        }
        /// <summary>
        /// Vizualizace
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return this.SqlCommand;
        }
        #endregion
        #region Mandatory
        /// <summary>
        /// Slovo, které charakterizuje tento příkaz
        /// </summary>
        public string SqlCommand { get { return "SELECT"; } }
        /// <summary>
        /// Klíčová slova této části příkazu = úvodní slovo příkazu
        /// </summary>
        protected override string Keywords { get { return this.SqlCommand; } }
        /// <summary>
        /// Metoda je volána tehdy, když bylo zjištěno, že aktuální stream odpovídá některému z klíčových slov tohoto objektu.
        /// Nalezené klíčové slovo je předáno v parametru.
        /// V této chvíli, když je volána tato metoda, je již nastavena property this.IsUsed na true.
        /// Tato metoda v bázové třídě ze streamu odebere klíčové slovo (všechny jeho prvky), takže ve streamu jsou na řadě následující hodnoty.
        /// </summary>
        /// <param name="stream">ParserStream</param>
        /// <param name="keyword">Klíčové slovo, které bylo reálně nalezeno</param>
        protected override void Load(ParserStream stream, string keyword)
        {
            base.Load(stream, keyword);
            this._Load(stream);
        }
        #endregion
        #region Parts of SQL SELECT command
        public SqlPartTop PartTop { get; private set; }
        public SqlPartFields PartFields { get; private set; }
        public SqlPartSources PartFrom { get; private set; }
        public SqlPartWhere PartWhere { get; private set; }
        public SqlPartOrder PartOrder { get; private set; }
        public SqlPartGroup PartGroup { get; private set; }
        private void _InitParts()
        {
            this.PartTop = new SqlPartTop();
            this.PartFields = new SqlPartFields();
            this.PartFrom = new SqlPartSources();
            this.PartWhere = new SqlPartWhere();
            this.PartOrder = new SqlPartOrder();
            this.PartGroup = new SqlPartGroup();
        }
        #endregion
        #region Load
        /// <summary>
        /// Naplní svoje prvky daty přicházejícími ze SqlStreamu
        /// </summary>
        /// <param name="stream"></param>
        private void _Load(ParserStream stream)
        {
            // Zpracuji jednotlivé části příkazu SELECT v pořadí, v jakém mají být přítomny. Zpracují se pouze ty, které budou mít správné úvodní slovo na očekávaném místě:
            this.PartTop.LoadFrom(stream);
            this.PartFields.LoadFrom(stream);
            this.PartFrom.LoadFrom(stream);
            this.PartWhere.LoadFrom(stream);
            this.PartOrder.LoadFrom(stream);
            this.PartGroup.LoadFrom(stream);
        }
        #endregion
        #region IPlugin
        string Asol.Reporting.Support.IPlugin.LicenseCode { get { return null; } }
        Asol.Reporting.Support.PluginActivityMode Asol.Reporting.Support.IPlugin.PluginActivity { get { return Support.PluginActivityMode.Standard; } }
        #endregion
    }
}
